package com.example.skindemo.loader;

import android.app.Activity;
import android.app.Application;

import androidx.appcompat.app.AppCompatCallback;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.appcompat.app.SkinAppCompatDelegateImpl;

import com.example.skindemo.BuildConfig;

import skin.support.SkinCompatManager;
import skin.support.app.SkinAppCompatViewInflater;
import skin.support.app.SkinCardViewInflater;
import skin.support.constraint.app.SkinConstraintViewInflater;
import skin.support.design.app.SkinMaterialViewInflater;
import skin.support.utils.SkinPreference;
import skin.support.utils.Slog;

/**
 * @author: tjf
 * @date: 2022-11-09
 * @desc： 皮肤入口使用  Android-skin-support:
 * 一款 Android 换肤框架, 极低的学习成本, 极好的用户体验
 */
public class SkinApiManager {

    /**
     * 初始化配置
     *
     * @param context 上下文
     */
    public static void init(Application context) {
        Slog.DEBUG = BuildConfig.DEBUG;

        SkinCompatManager.withoutActivity(context)
                .addStrategy(new CustomSDCardLoader())   // 自定义加载策略，指定SDCard路径
                .addInflater(new SkinAppCompatViewInflater())           // 基础控件换肤初始化
                .addInflater(new SkinMaterialViewInflater())            // material skin.support.design 控件换肤初始化[可选]
                .addInflater(new SkinConstraintViewInflater())          // ConstraintLayout 控件换肤初始化[可选]
                .addInflater(new SkinCardViewInflater())                // CardView v7 控件换肤初始化[可选]
//                .setSkinStatusBarColorEnable(false)                     // 关闭状态栏换肤，默认打开[可选]
//                .setSkinWindowBackgroundEnable(false)                   // 关闭windowBackground换肤，默认打开[可选]
                .loadSkin();
        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
    }

    // 继承AppCompatActivity 这个的必须重写该getDelegate()方法
    // 这个需要在BaseAcitivty 下重写
    // @NonNull
    //    @Override
    //    public AppCompatDelegate getDelegate() {
    //        return SkinAppCompatDelegateImpl.get(this, this);
    //    }

    /**
     * 重写其委托拦截器
     *
     * @param activity
     * @param callback
     * @return
     */
    public static AppCompatDelegate getDelegate(Activity activity, AppCompatCallback callback) {
        return SkinAppCompatDelegateImpl.get(activity, callback);
    }


    //获取皮肤包名
    public static String getSkinName() {
        String skinName = SkinPreference.getInstance().getSkinName();
        return skinName;
    }

    /**
     * 默认主题
     */
    public static void defultTheme() {
        SkinCompatManager.getInstance().restoreDefaultTheme();
    }

    /**
     * 加载皮肤包
     *
     * @param skinName 皮肤包名称
     * @param listener 回调
     * @param strategy 换肤的方式
     */
    public static void loadSkinFrom(String skinName,
                                    SkinLoaderListener listener, int strategy) {

        SkinCompatManager.getInstance().loadSkin(skinName,
                new SkinCompatManager.SkinLoaderListener() {
                    @Override
                    public void onStart() {
                        listener.onStart();
                    }

                    @Override
                    public void onSuccess() {
                        listener.onSuccess();
                    }

                    @Override
                    public void onFailed(String errMsg) {
                        listener.onFailed(errMsg);
                    }
                }, strategy);
    }

    /**
     * Assets下的皮肤加载   在 res 同级下新建assets/skins/ 路径
     *
     * @param skinName 皮肤包名称
     * @param listener 回调
     */
    public static void loadSkinFromAssets(String skinName, SkinLoaderListener listener) {
        SkinCompatManager.getInstance().loadSkin(skinName,
                new SkinCompatManager.SkinLoaderListener() {
                    @Override
                    public void onStart() {
                        listener.onStart();
                    }

                    @Override
                    public void onSuccess() {
                        listener.onSuccess();
                    }

                    @Override
                    public void onFailed(String errMsg) {
                        listener.onFailed(errMsg);
                    }
                }, SkinCompatManager.SKIN_LOADER_STRATEGY_ASSETS);
    }

    /**
     * 自定义的SD卡下的皮肤加载 记得 给予 读写权限   路径是 /storage/emulated/0/skins/skin_night.skin
     * <p>
     * <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
     * <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     * </p>
     *
     * @param skinName 皮肤包名称
     * @param listener 回调
     */
    public static void loadSkinFromSdCard(String skinName, SkinLoaderListener listener) {
        SkinCompatManager.getInstance().loadSkin(skinName,
                new SkinCompatManager.SkinLoaderListener() {
                    @Override
                    public void onStart() {
                        listener.onStart();
                    }

                    @Override
                    public void onSuccess() {
                        listener.onSuccess();
                    }

                    @Override
                    public void onFailed(String errMsg) {
                        listener.onFailed(errMsg);
                    }
                }, CustomSDCardLoader.SKIN_LOADER_STRATEGY_SDCARD);
    }

    /**
     * 皮肤包加载监听.
     */
    public interface SkinLoaderListener {
        /**
         * 开始加载.
         */
        void onStart();

        /**
         * 加载成功.
         */
        void onSuccess();

        /**
         * 加载失败.
         *
         * @param errMsg 错误信息.
         */
        void onFailed(String errMsg);
    }


    /**
     *
     * 实现SkinCompatSupportable接口
     *
     * applySkin方法中实现换肤操作
     *
     * 在构造方法中解析出需要换肤的resId
     *
     * 自定义View可以直接继承自SkinCompatView, SkinCompatLinearLayout等已有控件
     *
     * 自定义的view 的属性 要用 typedArray.getResourceId 来获取
     *
     *  其中的颜色值 或者背景图等 需要
     *  资源id
     *    loadingColor = SkinCompatHelper.checkResourceId(loadingColorId);
     *         if (loadingColor != INVALID_ID) {
     *          颜色赋值
     *          SkinCompatResources.getColor(getContext(), loadingColorId);
     *         图片赋值
     *         SkinCompatResources.getDrawable(getContext(), loadingColorId)
     *        }
     *
     *        最后的应用
     *
     *      applySkin方法中实现换肤操作
     *
     *      图片的方式
     *      public void appSkinBitmap() {
     *         focusBitId = SkinCompatHelper.checkResourceId(focusBitId);
     *         if (focusBitId != INVALID_ID) {
     *             Drawable drawable = SkinCompatResources.getDrawable(getContext(), focusBitId);
     *             mFocusBit = ((BitmapDrawable) drawable).getBitmap();
     *         }
     *     }
     */
}
